package it.polimi.politics.ejb.managers;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;








import it.polimi.politics.dto.UtentiDTO;
import it.polimi.politics.ejb.entities.Utenti;
import it.polimi.politics.ejb.entities.Group;
import it.polimi.politics.managers.*;

/**
 * Session Bean implementation class userMgrBean
 */
@Stateless
public class userMgrBean implements UserManager{

	@PersistenceContext
    private EntityManager em;
	@Resource
	private EJBContext context;
	
	
	@Override
	public List<UtentiDTO> trovaPoliticiPartito(int idPartito){
		List<Utenti> seleziona= new ArrayList<Utenti>();
		List<UtentiDTO> listaDTO=new ArrayList<UtentiDTO>();
		seleziona = em.createQuery("SELECT u FROM Utenti u WHERE u.partito.idpartito= :idpart").setParameter("idpart", idPartito).getResultList();
		
		for(int i = 0; i < seleziona.size(); i++){
			listaDTO.add(convertToDTO(seleziona.get(i)));
			
		}
		
		return listaDTO;
	}
	

	@Override
	public void addUser(UtentiDTO utente) {
		Utenti newUtente = new Utenti(utente);
		List<Group> groups = new ArrayList<Group>();
		groups.add(Group.USER);
		newUtente.setGroups(groups);
		em.persist(newUtente);
	}

	@Override
	@RolesAllowed({Group._USER,Group._ADMIN})
	public void updateUser(UtentiDTO utente) {
		em.merge(new Utenti(utente));
	}
	
	@Override
	@RolesAllowed({Group._USER})
	public void unregisterLoggedUser() {
		remove(getPrincipalUser());
	}


	@Override
	@RolesAllowed({Group._USER,Group._ADMIN})
	public UtentiDTO getUtente() {
		UtentiDTO utenteDTO = convertToDTO(getPrincipalUser());
		return utenteDTO;
	}
	
	public Utenti find(String id) {
    	return em.find(Utenti.class, id);
    }
    
    public List<Utenti> getAllUsers() {
    	return em.createNamedQuery(Utenti.FIND_ALL, Utenti.class)
                .getResultList();
    }

    public void remove(String id) {
		Utenti utente = find(id);
        em.remove(utente);
	}
    
    public void remove(Utenti utente) {
    	em.remove(utente);
	}
    
    
    public Utenti getPrincipalUser() {
    	return find(getPrincipalId());
    }
	
    
    public String getPrincipalId() {
    	return context.getCallerPrincipal().getName();
    }

    public UtentiDTO convertToDTO(Utenti utente) {
		
		UtentiDTO utenteDTO = new UtentiDTO();
		utenteDTO.setCitta(utente.getCitta());
		utenteDTO.setCodiceFiscale(utente.getCodicefiscale());
		utenteDTO.setCognome(utente.getCognome());
		utenteDTO.setDataDiNascita(utente.getDatadinascita());
		utenteDTO.setEMail(utente.getEmail());
		utenteDTO.setIDUtente(utente.getIDUtente());
		utenteDTO.setNome(utente.getNome());
		utenteDTO.setPassword(utente.getPassword());
		utenteDTO.setTipoUtente(utente.getTipoutente());
		utenteDTO.setUsername(utente.getUsername());
		return utenteDTO;
	}


	@Override
	public List<UtentiDTO> getAllUtenti() {
		List<Utenti>    utenti   = new ArrayList<Utenti>();
		List<UtentiDTO> utentiDTO= new ArrayList<UtentiDTO>();
		
		utenti = em.createNamedQuery(Utenti.FIND_ALL, Utenti.class).getResultList();
		
		for(int i = 0; i < utenti.size(); i++){
			utentiDTO.add(convertToDTO(utenti.get(i)));
			
		}
		
		return utentiDTO;
	}
    
}
